/**
 * Symbol
 * 一种保证对象内每个属性的名字都是唯一的机制
 * author:dengyiping
 * date:2016/08/01
 */

//ES6引入的新的原始数据类型Symbol，表示独一无二的值。
let s = Symbol();
console.log(s); // Symbol()
console.log(typeof s); //symbol


//注意Symbol函数前不能使用new命令,这是因为生成的Symbol是一个原始类型的值，不是对象。
//Symbol函数可以接受一个字符串作为参数，表示对Symbol示例的描述，主要是为了控制台显示、转为字符串时，比较容易区分
var s1 = Symbol();
var s2 = Symbol();
console.log(s1 === s2); // false
console.log(s1 == s2); // false

var s3 = Symbol();
var s4 = Symbol();
console.log(s3 === s4); // false
console.log(s3 == s4); // false 

//Symbol值不能与其他类型的值进行运算，会报错
var smb = Symbol("0");
//console.log("You create a data" + smb);//TypeError: Cannot convert a Symbol value to a string

//Symbol值可以显示转换
console.log(smb.toString());
console.log(Boolean(smb));

//symbol的实际应用场景
//以symbol为键的属性与数组元素类似，不能被类似obj.name的点号法访问，必须用方括号访问这些属性

//获取symbol的三种方式
//1.调用Symbol(),每次调用都是返回一个新的唯一symbol
//2.调用Symbol.for(String),这种方式会访问symbol注册表（存储了已经存在的symbol）,symbol注册表中的symbol是共享的。如Symbol.for("cat")，每次调用都是返回相同的symbol
//3.使用标准定义的symbol,例如：Symbol.iterator